# 装饰器：它接收另一个函数作为参数，并返回一个新的函数。装饰器可以在不修改原始函数代码的前提下扩展或修改其行为。

from functools import wraps # 装饰器会改变原函数的名字和文档字符串，用这个方法解决

def my_decorator(func):
    @wraps(func)  # 修饰此内部函数，保留原函数的名字和文档字符串
    def wrapper(*args, **kwargs):  # 带有参数的函数，在装饰器函数中使用 *args 和 **kwargs 来接收任意参数，并将其传递给原始函数. args 是一个元组，kwargs 是一个字典, * 是在解构它们
        print("Something is happening before the function is called.")
        func(*args, **kwargs)
        print("Something is happening after the function is called.")
    return wrapper


name = input("Type a name:")
@my_decorator  # 语法糖，应用装饰器
# @my_decorator2  #可以应用两个装饰器，会分别按照定义顺序执行多次
def say_hello(name):
    print(f"Hello {name}!")
say_hello(name)


